package com.cruise.game.service.user;

import com.cruise.game.model.param.user.AgentApplicationParam;
import com.cruise.game.model.param.user.RechargeParam;
import com.cruise.game.model.param.user.UpdateProfileParam;
import com.cruise.game.model.param.user.WithdrawParam;
import com.cruise.game.model.vo.common.PageResult;
import com.cruise.game.model.vo.user.TransactionVO;
import com.cruise.game.model.vo.user.UserProfileVO;
import com.cruise.game.model.vo.user.WithdrawalVO;

/**
 * 用户服务接口
 * 
 * @author cruise
 * @date 2025-02-28
 */
public interface UserService {

    /**
     * 获取用户个人信息
     *
     * @param userId 用户ID
     * @return 用户个人信息
     */
    UserProfileVO getUserProfile(Long userId);

    /**
     * 更新用户个人信息
     *
     * @param userId 用户ID
     * @param param  更新参数
     * @return 更新后的用户个人信息
     */
    UserProfileVO updateUserProfile(Long userId, UpdateProfileParam param);

    /**
     * 申请成为打手
     *
     * @param userId 用户ID
     * @param param  申请参数
     * @return 申请ID
     */
    Long applyAgent(Long userId, AgentApplicationParam param);

    /**
     * 余额充值
     *
     * @param userId 用户ID
     * @param param  充值参数
     * @return 支付信息
     */
    PaymentInfoVO recharge(Long userId, RechargeParam param);

    /**
     * 申请提现
     *
     * @param userId 用户ID
     * @param param  提现参数
     * @return 申请ID
     */
    Long withdraw(Long userId, WithdrawParam param);

    /**
     * 获取交易记录
     *
     * @param userId   用户ID
     * @param type     交易类型
     * @param page     页码
     * @param pageSize 每页条数
     * @return 交易记录
     */
    PageResult<TransactionVO> getTransactions(Long userId, String type, Integer page, Integer pageSize);

    /**
     * 获取提现申请列表
     *
     * @param userId   用户ID
     * @param status   申请状态
     * @param page     页码
     * @param pageSize 每页条数
     * @return 提现申请列表
     */
    PageResult<WithdrawalVO> getWithdrawals(Long userId, String status, Integer page, Integer pageSize);

    /**
     * 支付信息VO
     */
    class PaymentInfoVO {
        private String appId;
        private String timeStamp;
        private String nonceStr;
        private String packageValue;
        private String signType;
        private String paySign;

        public PaymentInfoVO(String appId, String timeStamp, String nonceStr, String packageValue, String signType,
                String paySign) {
            this.appId = appId;
            this.timeStamp = timeStamp;
            this.nonceStr = nonceStr;
            this.packageValue = packageValue;
            this.signType = signType;
            this.paySign = paySign;
        }

        public String getAppId() {
            return appId;
        }

        public String getTimeStamp() {
            return timeStamp;
        }

        public String getNonceStr() {
            return nonceStr;
        }

        public String getPackageValue() {
            return packageValue;
        }

        public String getSignType() {
            return signType;
        }

        public String getPaySign() {
            return paySign;
        }
    }
}
